package com.xy.webadmin.app.dao;

import com.xy.common.core.annotation.EnableDataPerm;
import com.xy.common.core.base.dao.BaseDaoMapper;
import com.xy.webadmin.app.model.Clazz;
import com.xy.webadmin.app.model.StudentClazz;
import com.xy.webadmin.app.model.TeacherClazz;
import org.apache.ibatis.annotations.Param;

import java.util.*;

/**
 * 班级数据操作访问接口。
 *
 * @author xiaoyue
 * @date 2025-05-13
 */
@EnableDataPerm
public interface ClazzMapper extends BaseDaoMapper<Clazz> {

    /**
     * 批量插入对象列表。
     *
     * @param clazzList 新增对象列表。
     */
    void insertList(List<Clazz> clazzList);

    /**
     * 获取过滤后的对象列表。
     *
     * @param clazzFilter 主表过滤对象。
     * @param orderBy 排序字符串，order by从句的参数。
     * @return 对象列表。
     */
    List<Clazz> getClazzList(
            @Param("clazzFilter") Clazz clazzFilter, @Param("orderBy") String orderBy);

    /**
     * 根据关联主表Id，获取关联从表数据列表。
     *
     * @param studentId 关联主表Id。
     * @param clazzFilter 从表过滤对象。
     * @param studentClazzFilter 多对多关联表过滤对象。
     * @param orderBy 排序字符串，order by从句的参数。
     * @return 从表数据列表。
     */
    List<Clazz> getClazzListByStudentId(
            @Param("studentId") Long studentId,
            @Param("clazzFilter") Clazz clazzFilter,
            @Param("studentClazzFilter") StudentClazz studentClazzFilter,
            @Param("orderBy") String orderBy);

    /**
     * 根据关联主表Id列表，获取关联从表数据列表。
     *
     * @param studentIds 关联主表Id列表。
     * @param clazzFilter 从表过滤对象。
     * @param orderBy 排序字符串，order by从句的参数。
     * @return 从表数据列表。
     */
    List<Clazz> getClazzListByStudentIds(
            @Param("studentIds") List<Long> studentIds,
            @Param("clazzFilter") Clazz clazzFilter,
            @Param("orderBy") String orderBy);

    /**
     * 根据关联主表Id，获取关联从表中没有和主表建立关联关系的数据列表。
     *
     * @param studentId 关联主表Id。
     * @param clazzFilter 过滤对象。
     * @param orderBy 排序字符串，order by从句的参数。
     * @return 与主表没有建立关联的从表数据列表。
     */
    List<Clazz> getNotInClazzListByStudentId(
            @Param("studentId") Long studentId,
            @Param("clazzFilter") Clazz clazzFilter,
            @Param("orderBy") String orderBy);

    /**
     * 根据关联主表Id，获取关联从表数据列表。
     *
     * @param teacherId 关联主表Id。
     * @param clazzFilter 从表过滤对象。
     * @param teacherClazzFilter 多对多关联表过滤对象。
     * @param orderBy 排序字符串，order by从句的参数。
     * @return 从表数据列表。
     */
    List<Clazz> getClazzListByTeacherId(
            @Param("teacherId") Long teacherId,
            @Param("clazzFilter") Clazz clazzFilter,
            @Param("teacherClazzFilter") TeacherClazz teacherClazzFilter,
            @Param("orderBy") String orderBy);

    /**
     * 根据关联主表Id列表，获取关联从表数据列表。
     *
     * @param teacherIds 关联主表Id列表。
     * @param clazzFilter 从表过滤对象。
     * @param orderBy 排序字符串，order by从句的参数。
     * @return 从表数据列表。
     */
    List<Clazz> getClazzListByTeacherIds(
            @Param("teacherIds") List<Long> teacherIds,
            @Param("clazzFilter") Clazz clazzFilter,
            @Param("orderBy") String orderBy);

    /**
     * 根据关联主表Id，获取关联从表中没有和主表建立关联关系的数据列表。
     *
     * @param teacherId 关联主表Id。
     * @param clazzFilter 过滤对象。
     * @param orderBy 排序字符串，order by从句的参数。
     * @return 与主表没有建立关联的从表数据列表。
     */
    List<Clazz> getNotInClazzListByTeacherId(
            @Param("teacherId") Long teacherId,
            @Param("clazzFilter") Clazz clazzFilter,
            @Param("orderBy") String orderBy);
}
